package ioc

import "fmt"

// 管理Controller对象
// 采用一个map来存储对象, 存储在内存中, 程序启动 解决多个impl对象的依赖问题
var controller = map[string]IocObject{}

// 对所有的对象统一执行 初始化
func InitController() error {
	for k, v := range controller {
		err := v.Init()
		if err != nil {
			return fmt.Errorf("init %s error, %s", k, err)
		}
	}

	return nil
}

// 可以管理任何对象, 我们定义的业务对象是不是还有基础的方法
// Init()  初始化对象的

// 托管业务实现的类
func RegistryController(obj IocObject) {
	// 避免覆盖
	// if _, ok := controller[obj.Name()]; ok {
	// 	panic("该对象已经注册: " + obj.Name())
	// }
	controller[obj.Name()] = obj
}

// 打印下当前已经托管的实例的名称
func ShowConntrollers() (names []string) {
	for k := range controller {
		names = append(names, k)
	}
	return names
}

func GetController(name string) any {
	v, ok := controller[name]
	if !ok {
		panic("controller not found: %s")
	}

	return v
}
